﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     dev
**Author:      MiPeng
**Date:        2021/11/12
**Description: 带按钮的浮点数输入框
*****************************************************/

#ifndef DOUBLEINPUT_H
#define DOUBLEINPUT_H

#include "../generalui_global.h"
#include "../GlobalUIDef.h"

#include "../Widgets/UiWidgetBase.h"
#include "DoubleSpinBox.h"

#include <QPushButton>

namespace GeneralUI {

	class GENERALUI_EXPORT DoubleInput : public UiWidgetBase
	{
		Q_OBJECT
			Q_PROPERTY(QString prefix READ prefix WRITE setPrefix STORED false)
			Q_PROPERTY(QString suffix READ suffix WRITE setSuffix STORED false)
			Q_PROPERTY(double maximum READ maximum WRITE setMaximum STORED false)
			Q_PROPERTY(double minimum READ maximum WRITE setMinimum STORED false)
			Q_PROPERTY(double value READ value WRITE setValue NOTIFY signalValueChanged STORED false USER true)
			Q_PROPERTY(double singleStep READ singleStep WRITE setSingleStep STORED false)
			Q_PROPERTY(bool m_isShowButton READ isShowButton WRITE setShowButton)
			Q_PROPERTY(bool m_isScreenMapping READ isScreenMapping WRITE setScreenMapping)
			Q_PROPERTY(double decimals READ decimals WRITE setDecimals STORED false)
			Q_PROPERTY(Qt::Alignment alignment READ getAlignment WRITE setAlignment STORED false)

	public:
		explicit DoubleInput(QWidget *parent = nullptr);
		~DoubleInput();

	public:
		/**
		 * @brief  setSingleStep    设置左右按钮步进，同DouleSpinBox上下
		 * @param  step             步进值
		 * @return void
		 */
		void setSingleStep(double step);

		/**
		 * @brief  setValue         设置控件当前值
		 * @param  val              值
		 * @return void
		 */
		void setValue(double value);

		/**
		 * @brief  setPrefix        设置控件前缀
		 * @param  prefix           前缀
		 * @return void
		 */
		void setPrefix(const QString &prefix);

		/**
		 * @brief  setSuffix        设置控件前缀
		 * @param  suffix           前缀
		 * @return void
		 */
		void setSuffix(const QString &suffix);

		/**
		 * @brief  setRange         设置控件范围
		 * @param  minimum          最小值
		 * @param  maximum          最大值
		 * @return void
		 */
		void setRange(double minimum, double maximum);

		/**
		 * @brief  setMaximum       设置最大值
		 * @param  maximum          最大值
		 * @return void
		 */
		void setMaximum(double maximum);

		/**
		 * @brief  setMinimum       设置最小值
		 * @param  minimum          最小值
		 * @return void
		 */
		void setMinimum(double minimum);

		/**
		 * @brief  setShowButton    设置左右按钮显示
		 * @param  show             true-显示(默认)，false-隐藏
		 * @return void
		 */
		void setShowButton(bool show);

		/**
		 * @brief  setScreenMapping  设置鼠标右键全屏映射
		 * @param  mapping           true-映射(默认),false-不映射
		 * @return void
		 */
		void setScreenMapping(bool mapping);

		/**
		 * @brief  setDecimals        设置精度
		 * @param  precision          位数，默认 2
		 * @return void
		 */
		void setDecimals(int precision);

		/**
		 * @brief  setAlignment       设置文本对齐方式
		 * @param  flag               对齐方式
		 * @return void
		 */
		void setAlignment(Qt::Alignment flag);

		/**
		 * @brief  singleStep         获取步进值
		 * @return double
		 */
		double singleStep() const;

		/**
		 * @brief  value              获取当前值
		 * @return double
		 */
		double value() const;

		/**
		 * @brief  prefix             获取前缀
		 * @return QString
		 */
		QString prefix() const;

		/**
		 * @brief  suffix             获取后缀
		 * @return QString
		 */
		QString suffix() const;

		/**
		 * @brief  maximum            获取最大值
		 * @return double
		 */
		double maximum() const;

		/**
		 * @brief  minimum            获取最小值
		 * @return double
		 */
		double minimum() const;

		/**
		 * @brief  isShowButton       是否显示左右按钮
		 * @return bool
		 */
		bool isShowButton();

		/**
		 * @brief  isScreenMapping    是否全屏映射
		 * @return bool
		 */
		bool isScreenMapping();

		/**
		 * @brief  decimals           获取精度
		 * @return int
		 */
		int decimals() const;

		/**
		 * @brief  getAlignment       获取文本对齐方式
		 * @return Qt::Alignment
		 */
		Qt::Alignment getAlignment();

		/**
		 * @brief  hasFocus 是否有焦点
		 * @return bool
		 */
		bool hasFocus() override;

		/**
		 * @brief  blockSignals 屏蔽信号
		 * @param  block 是否屏蔽 true-屏蔽, false-取消屏蔽
		 * @return bool
		 */
		bool blockSignals(bool block) override;

		/**
		 * @brief  setObjectName  设置对象名
		 * @param  name
		 * @return void
		 */
		void setObjectName(const QString &name);

	Q_SIGNALS:
		/**
		 * @brief  signalValueChanged        数值更改信号
		 * @param  value
		 * @return void
		 */
		void signalValueChanged(double value);

		/**
		 * @brief  signalEditingFinished     编辑完成信号
		 * @return void
		 */
		void signalEditingFinished();

	protected:
		/**
		 * @brief  paintEvent                 重写PaintEvent
		 * @param  event
		 * @return void
		 */
		void paintEvent(QPaintEvent *event) override;

		private Q_SLOTS :
		/**
		 * @brief  slotLeftButtonClicked     左按钮点击事件
		 * @return void
		 */
		void slotLeftButtonClicked();

		/**
		 * @brief  slotRightButtonClicked    右按钮点击事件
		 * @return void
		 */
		void slotRightButtonClicked();

	private:
		/**
		 * @brief  init                       初始化
		 * @return void
		 */
		void init();

	private:
		/** 中心数值输入控件
		 */
		DoubleSpinBox *m_doubleSpinBox;

		/** 左按钮
		 */
		QPushButton *m_leftButton;

		/** 右按钮
		 */
		QPushButton *m_rightButton;

		/** 是否显示左右按钮
		 */
		bool m_isShowButton;
	};

}

#endif // DOUBLEINPUT_H
